package com.wuxiaolong.backend.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;

import java.util.UUID;


@Component
@Aspect
@Slf4j
public class Aop {
    /**
     * 定义一个切入点.
     * 解释下：
     *
     * ~ 第一个 * 代表任意修饰符及任意返回值.
     * ~ 第二个 * 定义在web包或者子包
     * ~ 第三个 * 任意方法
     * ~ .. 匹配任意数量的参数.
     */
    @Pointcut("execution(* com.wuxiaolong.backend.controller.*.*(..))")
    public void logPointcut(){}

    @Around("logPointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{
        //String classAndMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        try {

            MDC.put("traceId", UUID.randomUUID().toString().replaceAll("-",""));
            Object result = joinPoint.proceed();
            return result;

        } catch (Throwable e) {
            log.error("MDC标识添加异常 ", e);
            throw e;
        }finally {
            MDC.clear();
        }



    }

}

